/**
 * 收银台对话框类
 * 业务层级：表现层
 * 功能说明：为收银台操作提供完整的用户界面，包括商品扫描、购物车管理、会员服务、支付处理等功能
 * 架构关系：遵循四层架构设计，作为表现层组件与业务逻辑层交互，提供直观的收银操作界面
 */
#ifndef CASHIERDIALOG_H
#define CASHIERDIALOG_H

#include <QDialog>
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QTableWidget>
#include <QTreeWidget>
#include <QDoubleSpinBox>
#include <QRadioButton>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QSpacerItem>
#include <QMessageBox>
#include <QTimer>
#include <QPropertyAnimation>
#include <QDateTime>
#include <QKeySequence>
#include <QScreen>
#include <QScrollArea>  // 新增：滚动区域支持
#include <memory>  // 新增：引入智能指针头文件

// 前置声明，减少编译依赖
class ProductDAO;
class MemberDAO;
class InventoryDAO;
class OrderService;
class PaymentProcessor;
class ShoppingCart;

class CashierDialog : public QDialog
{
    Q_OBJECT

public:
    explicit CashierDialog(
        ProductDAO* productDAO,  // 外部传入，保持原始指针
        MemberDAO* memberDAO,    // 外部传入，保持原始指针
        InventoryDAO* inventoryDAO,
        OrderService* orderService,
        PaymentProcessor* paymentProcessor,
        QWidget* parent = nullptr
    );
    ~CashierDialog();

private:
    // 主布局（全局布局，不归属具体层）
    QVBoxLayout *mainLayout;
    QScrollArea *scrollArea;  // 滚动区域
    QWidget *contentWidget;   // 内容容器

    // 第一层控件
    QLabel *titleLabel;

    // 第二层控件
    QHBoxLayout *secondLayout;
    QLabel *codeLabel;
    QLineEdit *codeEdit;
    QPushButton *clearCodeButton;
    QPushButton *productButton;
    QLabel *orderLabel;
    QLabel *orderValueLabel;
    QLabel *timeLabel;
    QLabel *timeValueLabel;
    QLabel *statusLabel;
    QLabel *statusValueLabel;
    QLabel *cashierLabel;
    QLabel *cashierValueLabel;

    // 第三层控件
    QHBoxLayout *thirdMainLayout;
    QTableWidget *productTable;
    QTreeWidget *hotProductTree;
    QLabel *stockInfoLabel;

    // 第三层-金额汇总相关
    QLabel *totalAmountLabel;
    QLabel *discountAmountLabel;
    QLabel *receivableAmountLabel;
    QDoubleSpinBox *paidAmountSpin;
    QLabel *changeAmountLabel;

    // 第三层-支付方式相关
    QRadioButton *cashRadio;
    QRadioButton *cardRadio;
    QRadioButton *wechatRadio;
    QRadioButton *alipayRadio;
    QRadioButton *memberBalanceRadio;

    // 第三层-交易操作相关
    QPushButton *receiptPreviewButton;
    QPushButton *printButton;
    QPushButton *suspendedOrderButton;
    QPushButton *checkoutButton;

    // 第四层控件
    QHBoxLayout *fourthMainLayout;

    // 第四层-商品操作按钮
    QPushButton *increaseButton;
    QPushButton *decreaseButton;
    QPushButton *deleteProductButton;
    QPushButton *modifyPriceButton;

    // 第四层-会员信息相关
    QLabel *memberCardLabel;
    QLineEdit *memberCardEdit;
    QPushButton *clearCardButton;
    QPushButton *memberButton;
    QLabel *nameLabel;
    QLabel *nameValueLabel;
    QLabel *levelLabel;
    QLabel *levelValueLabel;
    QLabel *pointsLabel;
    QLabel *pointsValueLabel;
    QLabel *balanceLabel;
    QLabel *balanceValueLabel;
    QLabel *totalSpentLabel;
    QLabel *totalSpentValueLabel;
    QLabel *discountRateLabel;
    QLabel *discountRateValueLabel;

    // 第四层-系统功能按钮
    QPushButton *lockButton;
    QPushButton *holdButton;
    QPushButton *resumeButton;
    QPushButton *exchangeButton;
    QPushButton *exitButton;

    // 数据成员（智能指针修改部分）
    std::unique_ptr<ShoppingCart> m_shoppingCart;  // 修改：原始指针→unique_ptr
    ProductDAO *m_productDAO;                      // 外部管理，保持原始指针
    std::unique_ptr<OrderService> m_orderService;  // 修改：原始指针→unique_ptr
    std::unique_ptr<InventoryDAO> m_inventoryDAO;  // 修改：原始指针→unique_ptr
    std::unique_ptr<MemberDAO> m_memberDAO;        // 修改：原始指针→unique_ptr
    std::unique_ptr<QPropertyAnimation> m_statusAnimation;  // 修改：原始指针→unique_ptr
    int m_currentOrderId; // 当前订单ID
    int m_currentCustomerId; // 当前会员ID
    double m_customerDiscountRate; // 会员折扣率
    std::unique_ptr<PaymentProcessor> m_paymentProcessor;  // 修改：原始指针→unique_ptr

    // UI初始化函数
    void setupUI();
    void createFirstLayer();
    void createSecondLayer();
    void createThirdLayer();
    void createFourthLayer();

    // 业务逻辑函数
    void showProductSelectionDialog(const QVector<QMap<QString, QVariant>>& products);
    void updateProductTable();
    void updateAmountDisplay();
    void onCheckoutButtonClicked();
    void onOrderCreated(int orderId);
    void onOrderPaid(int);
    void onOrderError(const QString &errorMessage);

    // 动画与显示函数
    void resetOrderDisplay();
    void initAnimations();
    void animateStatusChange(const QString& newStatus, const QString& newStyle);

private slots:
    void onExitClicked();
    void onCodeEditReturnPressed();
    void onCartUpdated();
    void onClearCartButtonClicked();
    void onMemberCardEditReturnPressed();
    void onClearCardButtonClicked();
    void onPaidAmountChanged(double amount);
    void onPaymentMethodChanged();
    void onPaymentCompleted(int orderId, bool success, const QString &message);
};

#endif // CASHIERDIALOG_H
